﻿using System;
using System.Data;
using Csla;
using Csla.Data;
using Csla.Tools;
using Csla.Validation;
using DemoCSLA.DalLinq;

namespace DemoCSLA.Libreria.Editables
{

    //******************************************
    //Clase generada por un Snippet de Erick Orlando © 2010
    //******************************************

    //Agregue aqui los using necesarios

    [Serializable()]
    public partial class Producto : BusinessBase<Producto>
    {

        #region Propiedades públicas

        private static PropertyInfo<string> m_IdProducto = RegisterProperty<string>(c => c.IdProducto);
        public string IdProducto
        {
            get { return GetProperty(m_IdProducto); }
            set { SetProperty(m_IdProducto, value); }
        }

        private static PropertyInfo<int> m_Codigo = RegisterProperty<int>(c => c.Codigo);
        public int Codigo
        {
            get { return GetProperty(m_Codigo); }
            set { SetProperty(m_Codigo, value); }
        }

        private static PropertyInfo<string> m_Descripcion =
            RegisterProperty<string>(c => c.Descripcion, "Descripción del Producto");
        public string Descripcion
        {
            get { return GetProperty(m_Descripcion); }
            set { SetProperty(m_Descripcion, value); }
        }


        private static PropertyInfo<Decimal> m_PrecioUnitario =
            RegisterProperty<Decimal>(c => c.PrecioUnitario, "Precio Unitario");
        public Decimal PrecioUnitario
        {
            get { return GetProperty(m_PrecioUnitario); }
            set { SetProperty(m_PrecioUnitario, value); }
        }

        #endregion //Propiedades públicas

        #region Reglas Validación

        protected override void AddBusinessRules()
        {

            ValidationRules.AddRule(CommonRules.StringRequired, m_Descripcion);
            ValidationRules.AddRule(CommonRules.MinValue<Decimal>,
                      new CommonRules.MinValueRuleArgs<Decimal>(m_PrecioUnitario, Convert.ToDecimal(0.5)));
        }

        #endregion //Reglas Validación

        #region Métodos de instanciación

        private Producto()
        { }

        public static Producto NewProducto()
        { return DataPortal.Create<Producto>(); }

        public static Producto GetProducto(String IdProducto)
        { return DataPortal.Fetch<Producto>(new SingleCriteria<Producto, String>(IdProducto)); }

        public static void DeleteProducto(String IdProducto)
        { DataPortal.Delete(new SingleCriteria<Producto, String>(IdProducto)); }

        #endregion // Métodos de instanciación

        #region Data Access

        #region Data Access - Create

        [RunLocal()]
        protected new void DataPortal_Create()
        {//Inicializar las propiedades que crea conveniente
            LoadProperty(m_IdProducto, Guid.NewGuid().ToString());
            LoadProperty(m_Codigo, Correlativo.Buscar().Codigo);
            ValidationRules.CheckRules();
        }


        #endregion // Data Access - Create

        #region Data Access - Fetch

        private void DataPortal_Fetch(SingleCriteria<Producto, string> criteria)
        {

            using (var ctx = ContextManager<DemoCSLADataContext>
                .GetManager(Contexto.DemoCSLA))
            {
                var q = Mercaderia.GetProductoById(ctx.DataContext, criteria.Value);

                LoadProperty(m_IdProducto, q.IdProducto);
                LoadProperty(m_Codigo, q.Codigo);
                LoadProperty(m_Descripcion, q.Descripcion);
                LoadProperty(m_PrecioUnitario, q.PrecioUnitario);
            }

            MarkOld();

            ValidationRules.CheckRules();
        }

        #endregion //Data Access - Fetch

        #region Data Access - Insert

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Insert()
        {
            using (var ctx = ContextManager<DemoCSLADataContext>
                .GetManager(Contexto.DemoCSLA))
            {
                var producto = new DalLinq.Mercaderia();
                DoInsertUpdate(producto);

                ctx.DataContext.Mercaderia.InsertOnSubmit(producto);
                ctx.DataContext.SubmitChanges();

                MarkOld();
            }
        }

        #endregion //Data Access - Insert

        #region Data Access - Update

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Update()
        {
            using (var ctx = ContextManager<DemoCSLADataContext>
                .GetManager(Contexto.DemoCSLA))
            {
                var producto = DalLinq.Mercaderia.GetProductoById(ctx.DataContext, 
                                         ReadProperty(m_IdProducto));

                DoInsertUpdate(producto);

                ctx.DataContext.SubmitChanges();

                MarkOld();
            }
        }

        #endregion //Data Access - Update

        #region DoInsertUpdate

        private void DoInsertUpdate(DalLinq.Mercaderia obj)
        {
                obj.IdProducto = ReadProperty(m_IdProducto);
                obj.Codigo = ReadProperty(m_Codigo);
                obj.Descripcion = ReadProperty(m_Descripcion);
                obj.PrecioUnitario =  ReadProperty(m_PrecioUnitario);
        }

        #endregion //DoInsertUpdate

        #region Data Access - Delete

        [Transactional(TransactionalTypes.TransactionScope)]
        private void DataPortal_Delete(SingleCriteria<Producto, string> criteria)
        {
            using (var ctx = ContextManager<DemoCSLADataContext>
                .GetManager(Contexto.DemoCSLA))
            {
                var q = DalLinq.Mercaderia.GetProductoById(ctx.DataContext,
                    criteria.Value);

                ctx.DataContext.Mercaderia.DeleteOnSubmit(q);
                ctx.DataContext.SubmitChanges();
            }
        }

        #endregion // Data Access - Delete

        #endregion //Data Access

        #region Correlativo
        public class Correlativo : CommandBase
        {
            public Correlativo()
            { }
            public int Codigo { get; set; }

            public static Correlativo Buscar()
            {
                return DataPortal.Execute<Correlativo>(new Correlativo());
            }

            protected override void DataPortal_Execute()
            {
                using (var ctx = ContextManager<DemoCSLADataContext>
                    .GetManager(Contexto.DemoCSLA))
                {
                    Codigo = ctx.DataContext.uspGetCorrelativoProducto().Value;
                }
            }

        }
        #endregion

    }

}
